package com.matu.controller;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Locale;

import javax.servlet.http.HttpServletRequest;

import org.json.simple.parser.ParseException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.matu.domain.Adresse;
import com.matu.domain.StationVelo;
import com.matu.domain.Trajet;
import com.matu.service.ServiceGoogle;
import com.matu.service.ServiceJCDecaux;
import com.matu.service.ServiceTisseo;
import com.matu.util.Fiabilite;
import com.matu.util.ToolBox;
import com.matu.util.Vitesse;



@Controller
public class MonTrajetController {

	
	private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
	
	@RequestMapping(value = "/monTrajet", method = RequestMethod.GET)
	public String monTrajet(Locale locale, Model model, HttpServletRequest request) {
		logger.info("Welcome home! The client locale is {}.", locale);
	
		String destination = request.getParameter("destination");
		
		if (destination != null){
			
		
			ServiceGoogle sGoogle = new ServiceGoogle();
		
				
			/*
			 * Chercher les lignes
			 */
			ArrayList<Adresse> listeDesAdresse = new ArrayList<Adresse>();
			try {
				listeDesAdresse = sGoogle.getServiceCoordFromAdresse(destination);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			
			if (!listeDesAdresse.isEmpty()) {
				
				Adresse premierAdresse = listeDesAdresse.get(0);
				
				// Pour les vélos
				model.addAttribute("adresse", premierAdresse);
				
				ServiceJCDecaux sJCDecaux = new ServiceJCDecaux();
			
				StationVelo station = sJCDecaux.getClosestStation
						(premierAdresse.getLatitude(), premierAdresse.getLongitude());
				
				if (station != null){
					Double duree = Vitesse.calculeVitesseVelo
							(ToolBox.coordXPaulSab, ToolBox.coordYPaulSab, 
									station.getLatitude(), station.getLongitude());
					
					model.addAttribute("station", station);
					model.addAttribute("duree", duree);
					
					double fiabilite = Fiabilite.calculeFiabiliteVelo(station);
					
					model.addAttribute("fiabilitevelo", fiabilite);
					model.addAttribute("veloError", false);
				}else{
					model.addAttribute("veloError", true);
				}
				
				
				// Pour les bus et métros
				
				ServiceTisseo sTisseo = new ServiceTisseo();
				Trajet trajetSelectionner = new Trajet();
				try {
					trajetSelectionner = sTisseo.calculerLeTrajetVers( premierAdresse ) ;
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (ParseException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
				if (trajetSelectionner != null){

					model.addAttribute("trajetSelectionner", trajetSelectionner);
					double fiabiliteBM = Fiabilite.calculeFiabiliteBusMetro(trajetSelectionner.getLigne());
					model.addAttribute("fiabilitebusmetro", fiabiliteBM);
					model.addAttribute("busMetroError", false);
				}
				else{
					model.addAttribute("busMetroError", true);
				}
			}
		}
		
		
		return "monTrajet";
	}
	
}
